import {
	isObject
} from '@/utils/is';

/**
 * 深度合并
 * @param src
 * @param target
 */
export function deepMerge(src = {}, target = {}) {
	let key;
	for (key in target) {
		src[key] = isObject(src[key]) ? deepMerge(src[key], target[key]) : (src[key] = target[key]);
	}
	return src;
}

/**
 * 获取静态图片
 * @param path
 * @returns
 */
export function getStaticImage(path) {
	const fullPath = `/src/static/images/${path}`;
	const modules = require.context('/src/static/images/**/*', {
		eager: true
	});
	return modules[fullPath].default;
}

// 回显数据字典
export function selectDictLabel(datas, value, map = {
	label: 'label',
	value: 'value'
}) {
	if (value === undefined) {
		return '';
	}
	const actions = [];
	Object.keys(datas).some((key) => {
		if (datas[key][map.value] == '' + value) {
			actions.push(datas[key][map.label]);
			return true;
		}
	});
	if (actions.length === 0) {
		actions.push(value);
	}
	return actions.join('');
}

// 回显数据字典（字符串数组）
export function selectDictLabels(datas, value, separator) {
	if (value === undefined) {
		return '';
	}
	const actions = [];
	const currentSeparator = undefined === separator ? ',' : separator;
	const temp = value.split(currentSeparator);
	Object.keys(value.split(currentSeparator)).some((val) => {
		let match = false;
		Object.keys(datas).some((key) => {
			if (datas[key].value == '' + temp[val]) {
				actions.push(datas[key].label + currentSeparator);
				match = true;
			}
		});
		if (!match) {
			actions.push(temp[val] + currentSeparator);
		}
	});
	return actions.join('').substring(0, actions.join('').length - 1);
}

/**
 * 构造树型结构数据
 * @param {*} data 数据源
 * @param {*} id id字段 默认 'id'
 * @param {*} parentId 父节点字段 默认 'parentId'
 * @param {*} children 孩子节点字段 默认 'children'
 */
export function handleTree(data, id, parentId, children) {
	const config = {
		id: id || 'id',
		parentId: parentId || 'parentId',
		childrenList: children || 'children',
	};

	const childrenListMap = {};
	const nodeIds = {};
	const tree = [];

	for (const d of data) {
		const parentId = d[config.parentId];
		if (childrenListMap[parentId] == null) {
			childrenListMap[parentId] = [];
		}
		nodeIds[d[config.id]] = d;
		childrenListMap[parentId].push(d);
	}

	for (const d of data) {
		const parentId = d[config.parentId];
		if (nodeIds[parentId] == null) {
			tree.push(d);
		}
	}

	for (const t of tree) {
		adaptToChildrenList(t);
	}

	function adaptToChildrenList(o) {
		if (childrenListMap[o[config.id]] !== null) {
			o[config.childrenList] = childrenListMap[o[config.id]];
		}
		if (o[config.childrenList]) {
			for (const c of o[config.childrenList]) {
				adaptToChildrenList(c);
			}
		}
	}
	return tree;
}

/**
 *  tree 根据最后一级 ID 查找所有父级节点
 * @param {*} list 数据源
 * @param {*} id 节点id
 */
export function find(list, id) {
	if (!list || !id) {
		return '';
	}
	const arr = [];
	const findParent = (data, nodeId, parentId) => {
		for (let i = 0, length = data.length; i < length; i++) {
			const node = data[i];
			if (node.id === nodeId) {
				arr.unshift(data[i]);
				if (nodeId === list[0].id) {
					break;
				}
				findParent(list, parentId);
				break;
			} else {
				if (node.children) {
					findParent(node.children, nodeId, node.id);
				}
				continue;
			}
		}
		return arr;
	};
	return findParent(list, id);
}

// 读取本地文件的方法 参数1为文件名称，参数2为回调方法用于处理获取到的文件数据
export const fetchFileData = (fileName, callback) => {
	plus.io.requestFileSystem(
		plus.io.PUBLIC_DOCUMENTS, // 文件系统中的根目录
		(fs) => {
			// 创建或打开文件, fs.root是根目录操作对象,直接fs表示当前操作对象
			// @ts-ignore
			fs.root.getFile(
				'file://storage/emulated/0/QBY/' + fileName, // 要操作的文件对象
				// 'content://com.android.externalstorage.documents/document/primary:QBY/' + fileName, // 要操作的文件对象
				{
					create: true, // 文件不存在则创建
				},
				(fileEntry) => {
					// 文件在手机中的路径
					console.log('文件在手机中的路径', fileEntry.fullPath);
					fileEntry.file(function(file) {
						// @ts-ignore
						const fileReader = new plus.io.FileReader();
						console.log('getFile:' + JSON.stringify(file));
						fileReader.readAsText(file, 'utf-8');
						fileReader.onloadend = function(res) {
							console.log('读取文件内容完成', res);
							//读取文件内容成功后的回调事件
							//res.target.result读取到的文件内容信息
							console.log('最后读取文件内容是=======', res.target.result);
							callback(res.target.result);
						};
					});
				},
				(e) => {
					console.log('报错111', 'getFile failed: ' + e.message);
				},
			);
		},

		(e) => {
			console.log('报错222', e.message);
		},
	);
};

// 读取本地文件的方法 参数1为文件名称，参数2为回调方法用于处理获取到的文件数据
export function readJsonByFile(fileNamePath, callback) {
	// 只能用于安卓 导入java类
	const File = plus.android.importClass('java.io.File');
	const BufferedReader = plus.android.importClass('java.io.BufferedReader');
	const FileReader = plus.android.importClass('java.io.FileReader');
	// 安卓11以下 /sdcard/自己的文件夹/1.txt
	// 安卓11 建议用 /storage/emulated/0/Download/自己的文件夹/1.txt
	// 读取txt文件 readFile ("/sdcard/修止符/配置.json")
	const readFile = (fileName) => {
		// @ts-ignore
		const readFr = new File(fileName);
		try {
			// @ts-ignore
			const reader = new BufferedReader(new FileReader(readFr));
			let txt;
			let retxt = '';
			let flag = true;
			while (flag) {
				txt = reader.readLine(); // 读取文件
				if (txt == null) {
					flag = false;
					break;
				}
				retxt = retxt + txt;
			}
			return retxt;
		} catch (e) {
			console.log(e);
			return '';
		}
	};
	const settingJsonPath = '/sdcard/data/' + fileNamePath;
	const json = readFile(settingJsonPath);
	console.log(json, 'json');
	callback(json);
}

export function getFile(e) {
	// #ifdef APP-PLUS
	const url = plus.io.convertLocalFileSystemURL(e);
	return new Promise((resolve, reject) => {
		plus.io.resolveLocalFileSystemURL(
			url,
			(entry) => {
				let reader = null;
				// @ts-ignore
				entry.file(
					(file) => {
						// @ts-ignore
						reader = new plus.io.FileReader();
						reader.onloadend = (read) => {
							// @ts-ignore
							resolve(read.target.result);
						};
						reader.readAsDataURL(file);
					},
					function(error) {
						alert(error.message);
					},
				);
			},
			(err) => {
				reject(err);
			},
		);
	});
	// #endif
	// #ifndef APP-PLUS
	return new Promise((resolve) => {
		resolve(e);
	});
	// #endif
}

// 清除本地应用数据 本地用户数据和缓存
export function clearAppUserData() {
	plus.android.importClass('android.app.ActivityManager');
	const Context = plus.android.importClass('android.content.Context');
	// @ts-ignore
	const am = plus.android.runtimeMainActivity().getSystemService(Context.ACTIVITY_SERVICE);
	am.clearApplicationUserData();
}